package com.imooc.controller.center;

import com.imooc.controller.BaseController;
import com.imooc.pojo.Users;
import com.imooc.pojo.bo.UserBO;
import com.imooc.pojo.bo.center.CenterUserBO;
import com.imooc.resource.FileUpload;
import com.imooc.service.center.CenterUserService;
import com.imooc.utils.CookieUtils;
import com.imooc.utils.DateUtil;
import com.imooc.utils.IMOOCJSONResult;
import com.imooc.utils.JsonUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Api(value = "用户信息接口",tags = {"用户信息相关接口"})
@RestController
@RequestMapping("userInfo")
public class CenterUserController extends BaseController {

    @Autowired
    private CenterUserService centerUserService;

    @Autowired
    private FileUpload fileUpload;

    @ApiOperation(value = "修改用户信息",notes = "修改用户信息",httpMethod = "POST")
    @PostMapping("update")
    public IMOOCJSONResult update(
            @ApiParam(name = "userId",value = "用户id",required = true)
            @RequestParam String userId,
                @RequestBody @Valid CenterUserBO centerUserBO,
            BindingResult result,
            HttpServletRequest request, HttpServletResponse response){
        Users users=centerUserService.queryUserInfo(userId);

        //判断BindingResult是否保存错误的验证信息，如果有，这直接return
        if (result.hasErrors()){
            Map<String,String> errorMap= getErrors(result);
            return IMOOCJSONResult.errorMap(errorMap);
        }

       Users usersResult= centerUserService.updateUserInfo(userId,centerUserBO);

       usersResult=setNullProperty(usersResult);

        CookieUtils.setCookie(request,response,"user", JsonUtils.objectToJson(usersResult),true);

        //TODO 后续要改，增加令牌token，会整合进redis，分布式会话

        return IMOOCJSONResult.ok(usersResult);
    }

    private Map<String,String> getErrors(BindingResult result){

        Map<String,String> map=new HashMap<>();

        List<FieldError> errorList = result.getFieldErrors();
        for (FieldError error:errorList){
            //发生验证错误说对应的某一个属性
            String errorField = error.getField();
            //验证错误的信息
            String errorMsg=error.getDefaultMessage();

            map.put(errorField,errorMsg);
        }
        return map;
    }

    private Users setNullProperty(Users users){
        users.setPassword(null);
        users.setMobile(null);
        users.setEmail(null);
        users.setCreatedTime(null);
        users.setUpdatedTime(null);
        users.setBirthday(null);
        return users;
    }

    @ApiOperation(value = "修改用户头像",notes = "修改用户头像",httpMethod = "POST")
    @PostMapping("uploadFace")
    public IMOOCJSONResult uploadFace(
            @ApiParam(name = "userId",value = "用户id",required = true)
            @RequestParam String userId,
            @ApiParam(name = "file",value = "用户头像",required = true)
            MultipartFile file,
            HttpServletRequest request, HttpServletResponse response){
        Users users=centerUserService.queryUserInfo(userId);

        //定义头像保存的地址
        String fileSpace=fileUpload.getImageUserFaceLocation();
        //在路径上为每一个增加一个userid，用于区分不同用户上传
        String uploadPathPrefix= File.separator+userId;

        if (file.getSize()>200)

        //开始上传文件
        if (file!=null){

            //获得文件上传的文件名称
            String fileName=file.getOriginalFilename();

            if (!StringUtils.isEmpty(fileName)){
                FileOutputStream fileOutputStream=null;
                try {
                    String fileNameArr[] = fileName.split("\\.");
                    //获取文件的后缀名
                    String suffix = fileNameArr[fileNameArr.length-1];

                    if (!suffix.equals("png") && !suffix.equals("jpg") && !suffix.equals("jpeg")){
                        return IMOOCJSONResult.errorMsg("图片格式不正确！");
                    }

                    //文件名重组 覆盖式上传，增量式：额外拼接当前时间
                    String newFileName="face-"+userId+ DateUtil.dateToString(new Date(),DateUtil.DATE_PATTERN) +"."+suffix;
                    //上传头像最终保存的位置
                    String fileFacePath = fileSpace+uploadPathPrefix+File.separator+newFileName;
                    //用于提供给web服务访问的地址
                    uploadPathPrefix +=("/"+newFileName);

                    File outFile=new File(fileFacePath);
                    if (outFile.getParentFile()!=null){
                        outFile.getParentFile().mkdirs();
                    }

                    InputStream inputStream= null;

                    //文件输出保存的目录
                     fileOutputStream=new FileOutputStream((outFile));
                    inputStream = file.getInputStream();
                    IOUtils.copy(inputStream,fileOutputStream);
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    if (fileOutputStream!=null){

                        try {
                            fileOutputStream.flush();
                            fileOutputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }


            }
        }else {
            return  IMOOCJSONResult.errorMsg("文件不能为空");
        }
        //获得图片服务地址
        String imageServerUrl=fileUpload.getImageServerUrl();

        //由于浏览器可能存在缓存的情况，所以在这里，我们需要加上时间戳来保证更新后的图片可以及时刷新
        String finalUserFaceUrl=imageServerUrl+uploadPathPrefix
                +"?t="+DateUtil.getCurrentDateString(DateUtil.DATE_PATTERN);

        //更新用户头像到数据库
        Users userResult=centerUserService.updateUserFace(userId,finalUserFaceUrl);

        userResult=setNullProperty(userResult);

        CookieUtils.setCookie(request,response,"user", JsonUtils.objectToJson(userResult),true);

        //TODO 后续要改，增加令牌token，会整合进redis，分布式会话

        return IMOOCJSONResult.ok();
    }

}
